# 错误处理
# python错误处理：https://docs.python.org/3/library/exceptions.html#exception-hierarchy
'''
'''
'''
在程序运行的过程中，如果发生了错误，可以事先约定返回一个错误代码，这样，就可以知道支付有错，以及出错的原因。在操作系统提供的调用中，返回错误码非常的
常见，比如打开文件的函数open(),成功时返回文件描述符（就是一个整数），出错时返回 -1

用错误码来表示是否出错十分不便，因为函数本身应该返回的正常结果和错误码混在一起，造成调用者必须用大量的代码来判断是否出错

所以必须使用try...except...finally错误处理机制
'''
print('START...')
try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except...', e)
finally:
    print('finally...')
print('END...')
print('-' * 100)

'''
START...
try...
except... division by zero
finally...
END...

'''

'''
当我们认为某些代码可能会出错时，就可以用 try 来运行这段代码，如果执行出错，则后续代码不会继续执行，而是直接跳转至错误处理代码，即 except 语句块
执行完 except 后，如果有 finally 语句块，则执行 finally 语句块，至此，执行完毕
'''
# 上面的代码在计算 10 / 0 时产生一个除法运算错误：
# 在输出可以看到，当错误发生时，后续语句 print('result:',  r)不会被执行，except 由于捕获到 ZeroDivisionError， 因此被执行。最后，finally
# 语句被执行，然后，程序继续按照流程走
# 如果把0改成2，则程序正常执行
print('START...')
try:
    print('try...')
    r = 10 / 2
    print('result:', r)
except ZeroDivisionError as e:
    print('except...', e)
finally:
    print('finally...')
print('END...')

print('-' * 100)
'''
输出：
START...
try...
result: 5.0
finally...
END...
'''

# 由于没有错误发生，所以 except 语句不会被执行，但是 finally 会被执行，所以不管错误是否发生，finally 都会被执行

# 捕获不同类型的错误
try:
    print('try...')
    r = 10 / int('a')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
finally:
    print('finally...')
print('END')
